package com.file.exercise;

import java.io.File;
import java.util.HashMap;

/**
 * @author げっしょく
 * @date 2021/7/30
 */
public class Test3 {
    static HashMap<String , Integer> h = new HashMap<>();
    public static void main(String[] args) {
        //路径为该模块
        File file = new File("Day12");
        //创建一个Map对象用来存储文件类型，和该文件类型出现的次数
        HashMap<String,Integer> hm = new HashMap<>();

        statistics(hm , file);
        System.out.println(hm);
        getCount(file);
        System.out.println(h);
    }

    private static void statistics(HashMap<String, Integer> hm, File file) {
        //把文件夹里面的文件夹和文件放在一个File类型的数组里面
        File[] files = file.listFiles();
        //使用增强for遍历数组
        for (File file1 : files) {
            //判断该file1是否为文件
            if(file1.isFile()){
                //是文件把文件的名字获取并交给 name
                String name = file1.getName();
                //通过"\\."进行切割字符串，并返回一个字符串数组
                //split() 这个方法支持正则表达式    而正则表达式中的.（点）表达任意字符
                //所以需要使用\\进行转义  让.代表它本身
                String[] split = name.split("\\.");//a\.txt
                //为了避免出现a.a.txt之类的特殊文件，所以只统计长度为2的字符串数组
                if (split.length == 2) {
                    //分割之后的长度为2的数组在其第一个索引上便是文件的后缀
                    String s = split[1];
                    //判断该后缀在不在Map这个集合中
                    if (hm.containsKey(s)) {
                        //如果存在就把出现的次数加1
                        Integer integer = hm.get(s);
                        integer++;
                        hm.put(s, integer);
                    }else{
                        //如果不存在就把改后缀添加进集合中，其出现的值为1
                        hm.put(s, 1);
                    }
                }
            }else {
                //进入这里就代表该路径对应的是一个文件夹
                //一个文件夹内是可能还会有其他的文件夹和文件的
                //所以会调用本身，在进入里面进行遍历
                statistics(hm , file1);
            }
        }
    }
    //方法二
    public static void getCount(File f ){
        File[] files = f.listFiles();
        //判断数组files是否为空
        if (files != null) {
            //循环遍历数组
            for (File file : files) {
                //判断是否为文件
                if (file.isFile()) {
                    //获取文件名
                    String name = file.getName();
                    //通过lastIndexOf获取最后一个.符号的索引
                    int i = name.lastIndexOf(".");
                    //截取.后面所有字符
                    String s;
                    //判断文件是否有后缀
                    if (i == -1) {
                        s = "没有";
                    }else {
                        //如果有后缀就索引值+1
                        s = name.substring(i + 1);
                    }
                    //判断后缀名是否存在
                    //不存在就加入HashMap这个类型的集合
                    if (h.containsKey(s)) {
                        int a = h.get(s);
                        //a++;
                        h.put(s, a + 1);
                    }else {
                        h.put(s, 1);
                    }
                }else{
                    //是文件就在往里面找
                    getCount(file);
                }
            }
        }
    }
}
